﻿//-------------------------------------------------------------------------------------
// All Rights Reserved , Copyright (C) 2011 , DotNet, Ltd.
//-------------------------------------------------------------------------------------

using System;
using System.Data;
using System.Data.Common;

namespace DotNet.BaseManager
{
    /// <summary>
    ///	IBaseManager
    /// 通用接口部分
    ///
    /// 总觉得自己写的程序不上档次，这些新技术也玩玩，也许做出来的东西更专业了。
    /// 修改纪录
    ///
    ///		2007.11.01 版本：1.9 DotNet 改进 BUOperatorInfo 去掉这个变量，可以提高性能，提高速度，基类的又一次飞跃。
    ///		2007.05.23 版本：1.8 DotNet 修改完善了 对象事件触发器，完善了GetDT, ref 方法部分。
    ///		2007.05.20 版本：1.7 DotNet 修改完善了 对象事件触发器，完善了GetDT方法部分。
    ///		2007.05.19 版本：1.6 DotNet 修改完善了 Delete，Exists方法部分，累了休息一下下，争取周六周日两天内完成。
    ///		2007.05.18 版本：1.5 DotNet 规范了一些接口的标准方法，进行了补充。
    ///		2007.05.17 版本：1.4 DotNet 重新调整主键的规范化，整体上又上升了一个层次了。
    ///		2006.02.05 版本：1.3 DotNet 重新调整主键的规范化。
    ///		2005.08.19 版本：1.2 DotNet 参数进行改进
    ///		2004.07.23 版本：1.1 DotNet 增加了接口ClearProperty、GetFromDS 的定义。
    ///		2004.07.21 版本：1.0 DotNet 提炼了最基础的方法部分、觉得这些是很有必要的方法。
    ///
    /// 版本：1.8
    ///
    /// <author>
    ///		<name>DotNet</name>
    ///		<date>2007.05.23</date>
    /// </author>
    /// </summary>
    public interface IBaseManager
    {
        //
        // 类对应的数据库最终操作
        //
        string AddEntity(object entity);

        int UpdateEntity(object entity);

        int DeleteEntity(object id);

        //DataTable GetEntity(string id);
        //DataTable GetEntity(string name, object value);

        //
        // 对象事件触发器（编写程序的人员，可以不实现这些方法）
        //

        bool AddBefore();

        bool AddAfter();

        bool UpdateBefore();

        bool UpdateAfter();

        bool GetBefore(string id);

        bool GetAfter(string id);

        bool DeleteBefore(string id);

        bool DeleteAfter(string id);

        //
        // 添加逻辑编写
        //
        // string Add();

        //
        // 更新逻辑编写
        //
        // int Update();

        //
        // 批量操作保存
        //
        int BatchSave(DataTable dataTable);

        //
        // 读取一条记录
        //
        DataTable Get(string id);

        object Get(DataTable dataTable, string id);

        DataTable Get(string name, object value);

        object Get(DataTable dataTable, string name, object value);

        object GetFrom(DataTable dataTable);

        object GetFrom(DataTable dataTable, string id);

        object GetFrom(DataRow dataRow);

        //
        // 获得 Id 列表
        //
        string[] GetIDs();

        string[] GetIDs(string name, Object[] values);

        string[] GetIDs(string order);

        string[] GetIDs(string name, object value);

        string[] GetIDs(string name1, object value1, string name2, object value2);

        string[] GetIDs(string name1, object value1, string name2, object value2, string order);

        string[] GetIDs(string name1, object value1, string name2, object value2, string order, int topLimit);

        string[] GetIDs(string name, object value, string order);

        string[] GetIDs(string order, int topLimit);

        string[] GetIDs(string name, object value, string order, int topLimit);

        string[] GetIDs(string[] names, Object[] values);

        string[] GetIDs(string[] names, Object[] values, string order);

        string[] GetIDs(string[] names, Object[] values, string order, int topLimit);

        //
        // 读取多条记录
        //
        DataTable GetDataTable();

        DataTable GetDataTable(string name, Object[] values);

        DataTable GetDataTable(string order);

        DataTable GetDataTable(string[] ids);

        DataTable GetDataTable(string name, object value);

        DataTable GetDataTable(string name1, object value1, string name2, object value2);

        DataTable GetDataTable(string name1, object value1, string name2, object value2, string order);

        DataTable GetDataTable(string name1, object value1, string name2, object value2, string order, int topLimit);

        DataTable GetDataTable(string name, object value, string order);

        DataTable GetDataTable(string order, int topLimit);

        DataTable GetDataTable(string name, object value, string order, int topLimit);

        DataTable GetDataTable(string[] names, Object[] values);

        DataTable GetDataTable(string[] names, Object[] values, string order);

        DataTable GetDataTable(string[] names, Object[] values, string order, int topLimit);

        //
        // 读取属性
        //
        string GetProperty(object id, string targetField);

        string GetProperty(string name1, object value1, string name2, object value2, string targetField);

        string GetProperty(string[] names, object[] values, string targetField);

        string GetID(string name, object value);

        string GetID(string name1, object value1, string name2, object value2);

        string GetID(string[] names, object[] values);

        //
        // 设置属性
        //
        int SetProperty(object id, string targetField, object targetValue);

        int SetProperty(object id, string[] targetFields, object[] targetValues);

        int SetProperty(string name1, object value1, string name2, object value2, string targetField, object targetValue);

        int SetProperty(object[] ids, string targetField, object targetValue);

        int SetProperty(string[] names, object[] values, string targetField, object targetValue);

        //
        // 判断数据是否存在
        //
        bool Exists(object id);

        bool Exists(object[] ids);

        bool Exists(string name, object value);

        bool Exists(string name, object value, object id);

        bool Exists(string name1, object value1, string name2, object value2);

        bool Exists(string name1, object value1, string name2, object value2, object id);

        bool Exists(string[] names, object[] values);

        //
        // 删除数据部分
        // force 是否强制删除关联数据
        //
        int Delete();

        int Delete(object id);

        int Delete(object id, bool force);

        int BatchDelete(object[] ids);

        int BatchDelete(object[] ids, bool force);

        int Delete(string name, object value);

        int Delete(string name, object value, bool force);

        int BatchDelete(string[] names, object[] values);

        int BatchDelete(string[] names, object[] values, bool force);

        int Delete(string name1, object value1, string name2, object value2);

        int Delete(string name1, object value1, string name2, object value2, bool force);

        int Truncate();

        /// 直接执行一些SQL语句的方法

        /// <summary>
        /// 执行查询语句
        /// </summary>
        /// <param name="commandText">sql查询</param>
        /// <returns>影响行数</returns>
        int ExecuteNonQuery(string commandText);

        /// <summary>
        /// 执行查询语句
        /// </summary>
        /// <param name="commandText">sql查询</param>
        /// <param name="dbParameters">参数集</param>
        /// <returns>影响行数</returns>
        int ExecuteNonQuery(string commandText, DbParameter[] dbParameters);

        /// <summary>
        /// 执行查询语句
        /// </summary>
        /// <param name="commandText">sql查询</param>
        /// <returns>object</returns>
        object ExecuteScalar(string commandText);

        /// <summary>
        /// 执行查询语句
        /// </summary>
        /// <param name="commandText">sql查询</param>
        /// <param name="dbParameters">参数集</param>
        /// <returns>Object</returns>
        object ExecuteScalar(string commandText, DbParameter[] dbParameters);

        /// <summary>
        /// 填充数据表
        /// </summary>
        /// <param name="commandText">查询</param>
        /// <returns>数据表</returns>
        DataTable Fill(string commandText);

        /// <summary>
        /// 填充数据表
        /// </summary>
        /// <param name="commandText">sql查询</param>
        /// <param name="dbParameters">参数集</param>
        /// <returns>数据表</returns>
        DataTable Fill(string commandText, DbParameter[] dbParameters);
    }
}